<?php defined('SYSPATH') or die('No direct script access.');

define('CHAR_LENGTH', 2);

class Model_Stemmer
{
    public static function stem($word){
       if (strstr($word, 'муж') !== false) {
           return 'муж';     
       }
       if (strstr($word, 'женщ') !== false || strstr($word, 'женск') !== false) {
           return 'жен';     
       } 
        
       $a = self::_rv($word);
       return $a[0].self::_step4(self::_step3(self::_step2(self::_step1($a[1]))));
    }

    protected static function _rv($word){
       $vowels = array('а','е','и','о','у','ы','э','ю','я');
       $flag = 0;
       $rv = $start='';
       for ($i=0; $i<strlen($word); $i+=CHAR_LENGTH){
          if ($flag == 1) $rv .= substr($word, $i, CHAR_LENGTH); else $start .= substr($word, $i, CHAR_LENGTH);
          if (array_search(substr($word,$i,CHAR_LENGTH), $vowels) !== FALSE) $flag = 1;
       }
       return array($start,$rv);
    }

    protected static function _step1($word){
       $perfective1 = array('в', 'вши', 'вшись');
       foreach ($perfective1 as $suffix) 
          if (substr($word, -(strlen($suffix))) == $suffix && (substr($word, -strlen($suffix) - CHAR_LENGTH, CHAR_LENGTH) == 'а' || substr($word, -strlen($suffix) - CHAR_LENGTH, CHAR_LENGTH) == 'я')) 
             return substr($word, 0, strlen($word)-strlen($suffix));
       $perfective2 = array('ив','ивши','ившись','ывши','ывшись');
       foreach ($perfective2 as $suffix) 
          if (substr($word, -(strlen($suffix))) == $suffix) 
             return substr($word, 0, strlen($word) - strlen($suffix));
       $reflexive = array('ся', 'сь');
       foreach ($reflexive as $suffix) 
          if (substr($word, -(strlen($suffix))) == $suffix) 
             $word = substr($word, 0, strlen($word) - strlen($suffix));
       $adjective = array('ее','ие','ые','ое','ими','ыми','ей','ий','ый','ой','ем','им','ым','ом','его','ого','ему','ому','их','ых','ую','юю','ая','яя','ою','ею');
       $participle2 = array('ем','нн','вш','ющ','щ');
       $participle1 = array('ивш','ывш','ующ');
       foreach ($adjective as $suffix) if (substr($word, -(strlen($suffix))) == $suffix){
          $word = substr($word, 0, strlen($word) - strlen($suffix));
          foreach ($participle1 as $suffix) 
             if (substr($word, -(strlen($suffix))) == $suffix && (substr($word, -strlen($suffix) - CHAR_LENGTH, CHAR_LENGTH) == 'а' || substr($word, -strlen($suffix) - CHAR_LENGTH, CHAR_LENGTH) == 'я')) 
                $word = substr($word, 0, strlen($word) - strlen($suffix));
          foreach ($participle2 as $suffix) 
             if (substr($word, -(strlen($suffix))) == $suffix) 
                $word = substr($word, 0, strlen($word) - strlen($suffix));
          return $word;
       }
       $verb1 = array('ла','на','ете','йте','ли','й','л','ем','н','ло','но','ет','ют','ны','ть','ешь','нно');
       foreach ($verb1 as $suffix) 
          if (substr($word, -(strlen($suffix))) == $suffix && (substr($word, -strlen($suffix) - CHAR_LENGTH, CHAR_LENGTH) == 'а' || substr($word, -strlen($suffix) - CHAR_LENGTH, CHAR_LENGTH) == 'я')) 
             return substr($word, 0, strlen($word) - strlen($suffix));
       $verb2 = array('ила','ыла','ена','ейте','уйте','ите','или','ыли','ей','уй','ил','ыл','им','ым','ен','ило','ыло','ено','ят','ует','уют','ит','ыт','ены','ить','ыть','ишь','ую','ю');
       foreach ($verb2 as $suffix) 
          if (substr($word, -(strlen($suffix))) == $suffix) 
             return substr($word, 0, strlen($word) - strlen($suffix));
       $noun = array('а','ев','ов','ие','ье','е','иями','ями','ами','еи','ии','и','ией','ей','ой','ий','й','иям','ям','ием','ем','ам','ом','о','у','ах','иях','ях','ы','ь','ию','ью','ю','ия','ья','я');
       foreach ($noun as $suffix) 
          if (substr($word, -(strlen($suffix))) == $suffix) 
             return substr($word, 0, strlen($word) - strlen($suffix));
       return $word;
    } 

    protected static function _step2($word){
       return substr($word, -CHAR_LENGTH, CHAR_LENGTH) == 'и' ? substr($word, 0, strlen($word) - CHAR_LENGTH) : $word;
    }

    protected static function _step3($word){
       $vowels = array('а','е','и','о','у','ы','э','ю','я');
       $flag = 0;
       $r1 = $r2 = '';
       for ($i=0; $i<strlen($word); $i+=CHAR_LENGTH){
          if ($flag==2) $r1 .= substr($word, $i, CHAR_LENGTH);
            if (array_search(substr($word, $i, CHAR_LENGTH), $vowels) !== FALSE) $flag = 1;
          if ($flag = 1 && array_search(substr($word, $i, CHAR_LENGTH), $vowels) === FALSE) $flag = 2;
       }
       $flag = 0;
       for ($i=0; $i<strlen($r1); $i+=CHAR_LENGTH){
          if ($flag == 2) $r2 .= substr($r1, $i, CHAR_LENGTH);
            if (array_search(substr($r1, $i, CHAR_LENGTH), $vowels) !== FALSE) $flag = 1;
            if ($flag = 1 && array_search(substr($r1, $i, CHAR_LENGTH), $vowels) === FALSE) $flag = 2;
        }
       $derivational = array('ост', 'ость');
       foreach ($derivational as $suffix) 
          if (substr($r2, -(strlen($suffix))) == $suffix) 
             $word = substr($word, 0, strlen($r2) - strlen($suffix));
       return $word;
    }

    protected static function _step4($word){
       if (substr($word, -CHAR_LENGTH * 2) == 'нн') $word = substr($word, 0, strlen($word) - CHAR_LENGTH);
       else {
          $superlative = array('ейш', 'ейше');
          foreach ($superlative as $suffix) 
             if (substr($word, -(strlen($suffix))) == $suffix) 
                $word = substr($word, 0, strlen($word) - strlen($suffix));
          if (substr($word, -CHAR_LENGTH * 2) == 'нн') $word = substr($word, 0, strlen($word) - CHAR_LENGTH);
       }
       if (substr($word, -CHAR_LENGTH, CHAR_LENGTH) == 'ь') $word = substr($word, 0, strlen($word) - CHAR_LENGTH);
       return $word;
    }	
}
